#ifndef ICPEUTIL_H
#define ICPEUTIL_H

#include <QObject>
#include <QString>

class ICpeUtil
{
public:
    virtual ~ICpeUtil() = default;

    /**
     * @brief sha256Encode SHA256编码
     * @param str           字符串
     * @return
     */
    virtual QString sha256Encode(const QString &str) = 0;

    /**
     * @brief md5Encode MD5编码
     * @param str       字符串
     * @return
     */
    virtual QString md5Encode(const QString &str) = 0;

    /**
     * @brief getCurTime 获得时间戳
     * @return 时间戳
     */
    virtual QString getCurTime() = 0;

    /**
     * @brief getXml    xml解析，返回xml第一个指定标签
     * @param str       原始xml
     * @param strXml    标签
     * @return
     */
    virtual QString getXml(const QString &str, const QString &strXml) = 0;

    /**
     * @brief getJson   json解析，返回xml第一个指定标签
     * @param str       原始json字符串
     * @param strTag    标签
     * @return
     */
    virtual QString getJson(const QString &str, const QString &strTag) = 0;

    /**
     * @brief maskToStr 2G和3G的频段号转描述
     * @param iMask     频段号
     * @return          频段描述
     */
    virtual QString maskToStr(int iMask) = 0;

    /**
     * @brief strToMask 2G和3G的描述转频段号
     * @param str       频段描述
     * @return          频段号
     */
    virtual int strToMask(const QString &str) = 0;

    /* 加密函数 */
    virtual QString getHWClientProof(const QString &strPass, const QString &strSalt, const QString &strServerNonce, int iIterations) = 0;
    virtual QString getPINSULogin(const QString &str) = 0;
    virtual QString getXorEncryptDecrypt(const QString &str1, const QString &str2) = 0;
    virtual int hexToDec(char a) = 0;
    virtual char decToHex(int a) = 0;
    virtual QString binToHex(const QString &strBin) = 0;
    virtual QString hexToBin(const QString &strHex) = 0;
    virtual QString getHWPassword(const QString &strUser, const QString &strPass, const QString &strToken) = 0;
    /* 加密函数结束 */

    /**
     * @brief strMid    字符串ABC给出A和C，返回B
     * @param str       原始字符串
     * @param strStart  起始子串
     * @param strEnd    结束子串
     * @return          中间子串
     */
    virtual QString strMid(const QString &str, const QString &strStart, const QString &strEnd) = 0;

    /**
     * @brief strToBandList 十六进制频段列表或逗号分隔的数组转vector数组
     * @param str           字符串
     * @return              频段列表
     */
    virtual std::vector<int> strToBandList(const QString &str) = 0;

    /**
     * @brief bandListToHex 频段列表转十六进制
     * @param vecBandList   频段列表
     * @return              16进制字符串
     */
    virtual QString bandListToHex(const std::vector<int> &vecBandList) = 0;

    /**
     * @brief bandListToStr 频段列表转逗号分隔的字符串
     * @param vecBandList   频段列表
     * @return              逗号分隔的字符串
     */
    virtual QString bandListToStr(const std::vector<int> &vecBandList) = 0;

    /**
     * @brief opeartorRegular   运营商文字规范化
     * @param str               运营商文字
     */
    virtual void opeartorRegular(QString &str) = 0;

    /**
     * @brief byteConv  比特或字节转流量或速度
     * @param bytes     原始字符串
     * @param isSpeed   是否为速度
     * @param isBit     是否为比特
     * @return
     */
    virtual QString byteConv(const QString &bytes, bool isSpeed, bool isBit) = 0;

    /**
     * @brief timeConv      时间秒转为字符串
     * @param strSeconds    秒数
     * @return
     */
    virtual QString timeConv(const QString &strSeconds) = 0;

    /**
     * @brief ambrConv  AMBR值转为字符串
     * @param str       AMBR值
     * @return
     */
    virtual QString ambrConv(const QString &str) = 0;

    /**
     * @brief versionCompare    版本比较
     * @param strCurrentVerion  当前版本
     * @param strTargetVersion  最新版本
     * @return int -1=输入格式错误 0=版本一样 1=当前版本低于最新版本 2=当前版本高于最新版本
     */
    virtual int versionCompare(const QString &strCurrentVerion, const QString &strTargetVersion) = 0;

    virtual int arfcnToLTEBand(const QString &strARFCN) = 0;
};

QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(ICpeUtil, "com.kk.cpemanager.icpeutil")
QT_END_NAMESPACE

#endif
